package card.manager;

import card.context.PlatformContext;
import card.player.AbstractPlayer;
import card.player.PlayerModel;

/**
 * @description: 纸牌管理器接口
 * 定义洗牌，发牌方法，结算方法
 * @author: ly
 * @date: 2020/8/20 17:04
 */
public interface Manager {

    /**
     * 纸牌初始化
     *
     * @return Manager
     */
    Manager cardInit();

    /**
     * 洗牌
     *
     * @return Manager
     */
    Manager shuffle();

    /**
     * 给多个玩家一次发牌
     *
     * @param players 玩家数组
     * @return Manager
     */
    Manager giveCards(AbstractPlayer... players);

    /**
     * 结算
     *
     * @param player 当前玩家
     * @return Manager
     */
    Manager settle(AbstractPlayer player);

    /**
     * 注册全局参数
     *
     * @param context 全局参数
     * @return Manager
     */
    Manager register(PlatformContext context);

    /**
     * 根据id获取玩家
     *
     * @param id 玩家id
     * @return 具体玩家
     */
    PlayerModel getPlayer(String id);

    /**
     * 获取随机玩家
     *
     * @return 具体玩家
     */
    PlayerModel getRandomPlayer();

    /**
     * 获取下一个玩家
     *
     * @return 具体玩家
     */
    PlayerModel getNextPlayer();

    /**
     * 获取下一个玩家,只获取一轮
     * @param firstId 从哪个玩家开始算
     * @return 具体玩家
     */
    PlayerModel getNextPlayerRound(String firstId);
}
